home *** CD-ROM | disk | FTP | other *** search
/ PCGUIA 117 / PC Guia 117.iso / Software / Utils / Software6 / Product13 / googlebar-0.9.5.06-fx.xpi / chrome / googlebar.jar / content / freshStart.js < prev    next >
Text File  |  2003-04-20  |  24KB  |  808 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Mouse googlebar for Mozilla.
  15.  *
  16.  * The Initial Developer of the Original Code is Pavol Vaskovic.
  17.  * Portions created by the Initial Developer are Copyright (C) 2001
  18.  * the Initial Developer. All Rights Reserved.
  19.  *    
  20.  *  Contributor(s):
  21.  *  Chase Tingley <tingley@sundell.net>
  22.  *  David Perry <d.perry@utoronto.ca>
  23.  *  Pavol Vaskovic <pali@pali.sk>
  24.  *
  25.  *    John Woods <johnrw@bestweb.net> April 2003
  26.  * 
  27.  * Alternatively, the contents of this file may be used under the terms of
  28.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  29.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  30.  * in which case the provisions of the GPL or the LGPL are applicable instead
  31.  * of those above. If you wish to allow use of your version of this file only
  32.  * under the terms of either the GPL or the LGPL, and not to allow others to
  33.  * use your version of this file under the terms of the MPL, indicate your
  34.  * decision by deleting the provisions above and replace them with the notice
  35.  * and other provisions required by the GPL or the LGPL. If you do not delete
  36.  * the provisions above, a recipient may use your version of this file under
  37.  * the terms of any one of the MPL, the GPL or the LGPL.
  38.  *
  39.  * ***** END LICENSE BLOCK ***** */
  40.  
  41.  
  42. var cTyp;
  43. var gfreshStartBundle;
  44. var goodbyeMsg;
  45.  
  46. const kDirServiceCID = Components.ID("{f00152d0-b40b-11d3-8c9c-000064657374}");
  47. const nsIProperties = Components.interfaces.nsIProperties;
  48. const nsIFileIID = Components.ID("{c8c0a080-0868-11d3-915f-d9d889d48e3c}");
  49.  
  50. var dSrv = Components.classes['@mozilla.org/file/directory_service;1'].createInstance();
  51. dSrv = dSrv.QueryInterface(Components.interfaces.nsIProperties);
  52.  
  53. var ios = Components.classes["@mozilla.org/network/io-service;1"]
  54.         .getService(Components.interfaces.nsIIOService);
  55.  
  56.  
  57.  
  58. function getFileUri( fpath ){
  59.  
  60.     // Interface change - ns7 (mozilla 1.0) needs nsIIOService
  61.     // latter (mozilla 1.2) needs nsIFileProtocolHandler
  62.     if(Components.interfaces.nsIFileProtocolHandler){
  63.       var fileHandler =
  64.       ios.getProtocolHandler("file")
  65.       .QueryInterface(Components.interfaces.nsIFileProtocolHandler);  
  66.       var newUri = fileHandler.getURLSpecFromFile(fpath);
  67.     } else {
  68.       var newUri = ios.getURLSpecFromFile(fpath);
  69.     }
  70.     
  71. return newUri;
  72. }
  73.  
  74.  
  75.  
  76. function showWebPage(pageUrl) {
  77.  
  78. try {
  79. var wmdata = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService();
  80. var wmediator = wmdata.QueryInterface(Components.interfaces.nsIWindowMediator);
  81. } catch(e) {
  82. // older than 1.2
  83. var wmdata = Components.classes["@mozilla.org/rdf/datasource;1?name=window-mediator"].getService();
  84. var wmediator = wmdata.QueryInterface(Components.interfaces.nsIWindowMediator);
  85.  
  86. // should we honor those anymore,
  87. // hate to think i have to test that far back?
  88. }
  89.  
  90.   var browserWindow = wmediator.getMostRecentWindow("navigator:browser");
  91.   if (browserWindow) {
  92.     try {
  93.       browserWindow.delayedOpenTab(pageUrl);
  94.     }
  95.     catch(e) {
  96.       browserWindow.loadURI(pageUrl);
  97.     }
  98.   }
  99.   else {
  100.     window.open(pageUrl);
  101.   }
  102. }
  103.  
  104. var singleButton, multiButton;
  105.  
  106. function setupTheseButtons()
  107. {
  108.     var sbSrv  = Components.classes['@mozilla.org/intl/stringbundle;1'].createInstance();
  109.     var sbSrvI   = sbSrv.QueryInterface(Components.interfaces.nsIStringBundleService);
  110.     bundle_freshStart=sbSrvI.createBundle("chrome://googlebar/locale/freshStart.properties");
  111.     gfreshStartBundle=document.getElementById("bundle_freshStart");
  112.     goodbyeMsg=gfreshStartBundle.getString("googlebarGoodbye");
  113.  
  114.     // find out if it is really there
  115.     var dSrvI = dSrv.get("AChrom", Components.interfaces.nsIFile);
  116.  
  117.     // start looking for our install type in mozilla's folder
  118.     
  119.     dSrvI.append("googlebar");
  120.     rv=dSrvI.exists();
  121.     if(rv)
  122.     cTyp ="AChrom";
  123.  
  124.  
  125.     dSrvI = dSrv.get("UChrm", Components.interfaces.nsIFile);
  126.     dSrvI.append("googlebar");
  127.     rv=dSrvI.exists();
  128.     if(rv)
  129.     cTyp ="UChrm";
  130.  
  131.     if(!cTyp){
  132.         alert(gfreshStartBundle.getString("googlebarFolderNotFound"));
  133.         return;
  134.         }
  135.  
  136. if(cTyp=="UChrm"){
  137.     singleButton=window.document.getElementById("singleUserUninstallButton");
  138.     singleButton.setAttribute("hidden", false);
  139.     singleButton.setAttribute("disabled", false);
  140.     }
  141.  
  142.  
  143. if(cTyp=="AChrom"){
  144.     multiButton=window.document.getElementById("multiUserUninstallButton");
  145.     multiButton.setAttribute("hidden", false);
  146.     multiButton.setAttribute("disabled", false);
  147.     }
  148.  
  149. }
  150.  
  151.  
  152.  
  153. function goConfirmUninstall(typIn){
  154.  
  155. // should never get here without typIn
  156. if(typIn)
  157.     cTyp = typIn ? typIn : "AChrom";
  158. else
  159.     cTyp = "AChrom";
  160.  
  161.   // ask user if he really wants to
  162.   if(confirm(gfreshStartBundle.getString("uninstallConfirmWarning")))
  163.     googlebarUninstall(cTyp);
  164. }
  165.  
  166. function googlebarUninstall(cTyp){
  167.   dump("Googlebar: "+cTyp+" googlebarUninstall\n");
  168.  
  169.  
  170.  
  171.   removePackageReferences(cTyp); 
  172.  
  173.   // remove their googlebar preferences
  174.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  175.               .getService(Components.interfaces.nsIPrefService);
  176.   var rootBranch = pref.getBranch("");
  177.  
  178.     // this is a bit much, couple of bytes really
  179.     rootBranch.deleteBranch("googlebar.");
  180.  
  181. }
  182.  
  183.  
  184. function removePackageReferences(cTyp){
  185.   dump("Googlebar: removePackageReferences\n");
  186.  
  187. var chromeUrl
  188. var dSrvI;
  189.  
  190. // BEGIN
  191.     //remove installed-chrome.txt lines first
  192.     if(cTyp=="AChrom")
  193.     rmvInstalledChrome();
  194.  
  195.     dSrvI = dSrv.get(cTyp, Components.interfaces.nsIFile);
  196.     dSrvI.append("chrome.rdf");
  197.  
  198.     fileUri=getFileUri( dSrvI );
  199.  
  200.     // chromeUrl is the
  201.     // file:// url of the chrome.rdf file 
  202.     // We use it after removing the overlayinfo pointers
  203.  
  204.     var chromeUrl = fileUri ;
  205.  
  206.  
  207.  
  208.  
  209. /* ///////////////////// Remove Overlayinfo Data /////////////////////////// */
  210.  
  211.  
  212. var folderName        = "navigator" ;
  213. var containerItem   = "chrome://navigator/content/navigator.xul" ;
  214. var nodeItem        = "chrome://googlebar/content/googlebarOverlay.xul" ;
  215. try { rmvOverlaysRDF(cTyp, folderName, containerItem, nodeItem ) ;}
  216. catch (e)
  217. { alert(gfreshStartBundle.getString("overlayErrorNavigator ") ); }
  218.  
  219. folderName            = "communicator" ;
  220. containerItem       = "chrome://communicator/content/pref/preftree.xul" ;
  221. nodeItem            = "chrome://googlebar/content/googlebarPrefOverlay.xul" ;
  222. try { rmvOverlaysRDF(cTyp, folderName, containerItem, nodeItem ) ;}
  223. catch (e)
  224. { alert(gfreshStartBundle.getString("overlayErrorCommunicator ") ); }
  225.  
  226. folderName             = "browser" ;
  227. containerItem        = "chrome://browser/content/browser.xul" ;
  228. nodeItem             = "chrome://googlebar/content/googlebarOverlay.xul" ;
  229. try { rmvOverlaysRDF(cTyp, folderName, containerItem, nodeItem ) ;}
  230. catch (e)
  231. { alert(gfreshStartBundle.getString("overlayErrorBrowser ") ); }
  232.  
  233. folderName             = "browser" ;
  234. containerItem        = "chrome://browser/content/pref/pref.xul" ;
  235. nodeItem             = "chrome://googlebar/content/googlebarPrefOverlay.xul" ;
  236. try { rmvOverlaysRDF(cTyp, folderName, containerItem, nodeItem ) ;}
  237. catch (e)
  238. { alert(gfreshStartBundle.getString("overlayErrorBrowser ") ); }
  239.  
  240.  
  241.  
  242. /* ///////////////////// Remove Chrome.rdf Data //////////////////////////// */
  243.  
  244.   dump("\tchrome url is " + chromeUrl + "\n");
  245.   // remove our references from chrome/chrome.rdf
  246.   dump("Call RDFU.loadDataSource\n" + chromeUrl + "\n");
  247.   RDFU.loadDataSource(chromeUrl , removeFromChrome);
  248.   dump("RDFU.loadDataSource returned OK.\n");
  249.  
  250.  
  251.  
  252. /* ///////////////////// Delete Files and Folder /////////////////////////// */
  253.  
  254. dSrvI = dSrv.get(cTyp, Components.interfaces.nsIFile); // reset it
  255. dSrvI.append("googlebar");
  256.  
  257. // fixme later this is redundant?
  258. fileUri=getFileUri( dSrvI );
  259.  
  260. dump("\tDeleting googlebar directory: \n\t" + dSrvI.path + "\n");
  261.  
  262. var delFils=confirm(gfreshStartBundle.getString("deleteFilesPrompt"));
  263. if(delFils)
  264. {
  265.   try {
  266.     var rv = dSrvI.remove(true);
  267.     dump("\n\tgooglebar: directory exists and was deleted:"+rv+"\n" + dSrvI.path +"\n" );
  268.   }
  269.   catch (err) {
  270.     dump("\tgooglebar directory NOT deleted. ERROR:\n" + err + "\n");
  271.     alert(gfreshStartBundle.getString("dirNotDeleted ")+ err);
  272.   }
  273. }
  274.  
  275. // should give us a second or two, before the exit
  276. alert(goodbyeMsg );
  277. goQuitApplication();
  278.  
  279. // DONE!  
  280. }
  281.  
  282.  
  283.  
  284.  
  285. /* ///////////////////// Remove All Chrome Data  /////////////////////////// */
  286.  
  287. // removeFromChrome is listener that removes all googlebar references from 
  288. // chrome/chrome.rdf when this DataSource is loaded
  289. var removeFromChrome = {
  290.   onDataSourceReady: function(aDS) 
  291.   {
  292.     dump("Googlebar: removeFromChrome\n");
  293.  
  294.     // get the sequence that holds all the packages
  295.     var rootSeq = RDFU.findSeq(aDS, "urn:mozilla:package:root");
  296.  
  297.     // get resource and node for your package
  298.     var myResource = gRDF.GetResource("urn:mozilla:package:googlebar");
  299.     var myNode = myResource.QueryInterface(Components.interfaces.nsIRDFNode);
  300.  
  301.     // and snip out your arc
  302.     rootSeq.RemoveElement(myNode, true);
  303.  
  304.     // now remove everything else we know about your package
  305.     var arcs = aDS.ArcLabelsOut(myResource);
  306.  
  307.     while(arcs.hasMoreElements()) {
  308.       var arc = arcs.getNext();
  309.     
  310.       // each arc is a property
  311.       var prop = arc.QueryInterface(Components.interfaces.nsIRDFResource);
  312.  
  313.       // For each property, get all targets, and unassert.  nested 
  314.       // enumeration is the best!
  315.       var targets = aDS.GetTargets(myResource, prop, true);
  316.  
  317.       while(targets.hasMoreElements()) {
  318.         var target = targets.getNext();
  319.  
  320.         var targetNode = target.QueryInterface(Components.interfaces.nsIRDFNode);
  321.         aDS.Unassert(myResource, prop, targetNode);
  322.       }
  323.     }
  324.     
  325.     //resource="urn:mozilla:locale:en-US:packages"
  326.     //resource="urn:mozilla:locale:en-US:googlebar"
  327.     dump("Googlebar: locales removeFromChrome\n");
  328.  
  329.     // get the sequence that holds all the packages
  330.     var rootSeq = RDFU.findSeq(aDS, "urn:mozilla:locale:en-US:packages");
  331.  
  332.     // get resource and node for your package
  333.     var myResource = gRDF.GetResource("urn:mozilla:locale:en-US:googlebar");
  334.     var myNode = myResource.QueryInterface(Components.interfaces.nsIRDFNode);
  335.  
  336.     // and snip out your arc
  337.     rootSeq.RemoveElement(myNode, true);
  338.  
  339.     // now remove everything else we know about your package
  340.     var arcs = aDS.ArcLabelsOut(myResource);
  341.  
  342.     while(arcs.hasMoreElements()) {
  343.       var arc = arcs.getNext();
  344.     
  345.       // each arc is a property
  346.       var prop = arc.QueryInterface(Components.interfaces.nsIRDFResource);
  347.  
  348.       // For each property, get all targets, and unassert.  nested 
  349.       // enumeration is the best!
  350.       var targets = aDS.GetTargets(myResource, prop, true);
  351.  
  352.       while(targets.hasMoreElements()) {
  353.         var target = targets.getNext();
  354.  
  355.         var targetNode = target.QueryInterface(Components.interfaces.nsIRDFNode);
  356.         aDS.Unassert(myResource, prop, targetNode);
  357.       }
  358.     }
  359.  
  360.  
  361.  
  362.  
  363.     // now flush the datasource back to disk
  364.     RDFU.saveDataSource(aDS);
  365.     dump("Googlebar: removeFromChrome OK\n");
  366.  
  367.   },
  368.  
  369.   onError: function(aStatus, aErrorMsg)
  370.   {
  371.     dump("Googlebar: removeFromChrome ERROR: status="+aStatus+",", aErrorMsg);
  372.   }
  373. };
  374.  
  375.  
  376.  
  377.  
  378. try {
  379. var gRDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService();
  380. gRDF = gRDF.QueryInterface(Components.interfaces.nsIRDFService);
  381.  
  382. var gRDFC = Components.classes['@mozilla.org/rdf/container;1'].getService();
  383. gRDFC = gRDFC.QueryInterface(Components.interfaces.nsIRDFContainer);
  384.  
  385. var gRDFCU = Components.classes['@mozilla.org/rdf/container-utils;1'].getService();
  386. gRDFCU = gRDFCU.QueryInterface(Components.interfaces.nsIRDFContainerUtils);
  387. } catch (ex) { alert("RDFU: " + ex);  }
  388.  
  389.  
  390.  
  391.  
  392. var RDFU = {
  393.   
  394.   getSeqElementAt: function(aSeq, aIndex)
  395.   {
  396.       var ordinal = gRDFCU.IndexToOrdinalResource(aIndex+1);
  397.     return aSeq.DataSource.GetTarget(aSeq.Resource, ordinal, true);
  398.   },
  399.   
  400.   readAttribute: function(aDS, aRes, aName)
  401.   {
  402.       var attr = aDS.GetTarget(aRes, gRDF.GetResource(aName), true);
  403.     if (attr)
  404.         attr = XPCU.QI(attr, "nsIRDFLiteral");
  405.       return attr ? attr.Value : null;
  406.   },
  407.   
  408.   
  409.   writeAttribute: function(aDS, aRes, aName, aValue)
  410.   {
  411.       var attr = aDS.GetTarget(aRes, gRDF.GetResource(aName), true);
  412.     if (attr)
  413.         aDS.Change(aRes, gRDF.GetResource(aName), attr, gRDF.GetLiteral(aValue));
  414.   },
  415.   
  416.   
  417.   findSeq: function(aDS, aResName)
  418.   {
  419.       try {
  420.       var res = gRDF.GetResource(aResName);
  421.       seq = this.makeSeq(aDS, res);
  422.     } catch (ex) { 
  423.       alert(gfreshStartBundle.getString("sequenceError ") + ex); 
  424.     }
  425.   
  426.     return seq;
  427.   },
  428.   
  429.   makeSeq: function(aDS, aRes)
  430.   {
  431.     var seq = XPCU.createInstance("@mozilla.org/rdf/container;1", "nsIRDFContainer");
  432.       seq.Init(aDS, aRes);
  433.     return seq;
  434.   },
  435.   
  436.   createSeq: function(aDS, aBaseRes, aArcRes)
  437.   {
  438.     var res = gRDF.GetAnonymousResource();
  439.     aDS.Assert(aBaseRes, aArcRes, res, true);
  440.     var seq = gRDFCU.MakeSeq(aDS, res); 
  441.     return seq;
  442.   },
  443.   
  444.   loadDataSource: function(aURL, aListener) 
  445.   {
  446.       var ds = gRDF.GetDataSource(aURL);
  447.     var rds = XPCU.QI(ds, "nsIRDFRemoteDataSource");
  448.     
  449.     var observer = new DSLoadObserver(aListener);
  450.     
  451.     if (rds.loaded) {
  452.         observer.onEndLoad(ds);
  453.     } else {
  454.       var sink = XPCU.QI(ds, "nsIRDFXMLSink");
  455.       sink.addXMLSinkObserver(observer);
  456.     }
  457.   },
  458.   
  459.   saveDataSource: function(aDS)
  460.   {
  461.     var ds = XPCU.QI(aDS, "nsIRDFRemoteDataSource");
  462.     ds.Flush();
  463.   }
  464. };
  465.  
  466. ///////////
  467.  
  468. function DSLoadObserver(aListener) { this.mListener = aListener; }
  469.  
  470. DSLoadObserver.prototype =
  471. {
  472.   onBeginLoad: function(aSink) { },
  473.   onInterrupt: function(aSink) {},
  474.   onResume: function(aSink) {},
  475.   onError: function(aSink, aStatus, aErrorMsg)
  476.   {
  477.  
  478.     this.mListener.onError(aStatus, aErrorMsg);
  479.  
  480.   },
  481.  
  482.   onEndLoad: function(aSink)
  483.   {
  484.     var ds = XPCU.QI(aSink, "nsIRDFDataSource");
  485.     var sink = XPCU.QI(ds, "nsIRDFXMLSink");
  486.     this.mListener.onDataSourceReady(ds);
  487.  
  488.   }
  489.  
  490. };
  491.  
  492.  
  493. var XPCU = 
  494.   getService: function(aURL, aInterface)
  495.   {
  496.     try {
  497.       return Components.classes[aURL].getService(Components.interfaces[aInterface]);
  498.     } catch (ex) {
  499.       dump("Error getting service: " + aURL + ", " + aInterface + "\n" + ex);
  500.       return null;
  501.     }
  502.   },
  503.  
  504.   createInstance: function (aURL, aInterface)
  505.   {
  506.     try {
  507.       return Components.classes[aURL].createInstance(Components.interfaces[aInterface]);
  508.     } catch (ex) {
  509.       dump("Error creating instance: " + aURL + ", " + aInterface + "\n" + ex);
  510.       return null;
  511.     }
  512.   },
  513.  
  514.   QI: function(aEl, aIName)
  515.   {
  516.     try {
  517.       return aEl.QueryInterface(Components.interfaces[aIName]);
  518.     } catch (ex) {
  519.       throw("Unable to QI " + aEl + " to " + aIName);
  520.     }
  521.   }
  522.  
  523. };
  524.  
  525.  
  526. function rmvInstalledChrome() {
  527.  
  528. var dSrvI = dSrv.get("AChrom", Components.interfaces.nsIFile);
  529. dSrvI.append("installed-chrome.txt");
  530.  
  531. var fileBuf = ReadFrom(dSrvI);
  532. fileBuf = fileBuf.replace(new RegExp('[^\\n\\r]+'+"resource:/chrome/googlebar/content/"+'[\\n\\r]+', 'g'), '');
  533. WriteTo(dSrvI, fileBuf);
  534.  
  535. fileBuf = ReadFrom(dSrvI);
  536. fileBuf = fileBuf.replace(new RegExp('[^\\n\\r]+'+"/googlebar/"+'[\\n\\r]+', 'g'), '');
  537. WriteTo(dSrvI, fileBuf);
  538.  
  539. }
  540.  
  541.   function ReadFrom(f) 
  542. {
  543.  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
  544. var stream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
  545. if(f.exists())stream.init(f, 1, 0, false); // open as "read only"
  546. else return ;
  547.  
  548. var scriptableStream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream);
  549. scriptableStream.init(stream);
  550.  
  551. var fileSize = scriptableStream.available();
  552. var fileContents = scriptableStream.read(fileSize);
  553.  
  554. scriptableStream.close();
  555. stream.close();
  556.  
  557. return fileContents;
  558. }
  559.  
  560. function WriteTo(f, buf) 
  561. {
  562. netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
  563. if (f.exists()) f.remove(true);
  564. f.create(f.NORMAL_FILE_TYPE, 0666);
  565.  
  566. var stream =
  567. Components.classes['@mozilla.org/network/file-output-stream;1']
  568. .createInstance(Components.interfaces.nsIFileOutputStream);
  569.  
  570. stream.init(f, 2, 0x200, false); // open as "write only"
  571. stream.write(buf, buf.length);
  572. stream.close();
  573.  
  574. }  
  575.  
  576.  
  577. // remove the overlay entry in overlays.rdf
  578. function rmvOverlaysRDF(cTyp, folderName, containerItem, nodeItem ){
  579.  
  580. var dSrvI = dSrv.get(cTyp, Components.interfaces.nsIFile);
  581. dSrvI.append("overlayinfo");
  582. dSrvI.append(folderName);
  583. dSrvI.append("content");
  584. dSrvI.append("overlays.rdf");
  585.  
  586. removeRDFContainer(dSrvI, containerItem, nodeItem);
  587. }
  588.  
  589.  
  590. function removeRDFContainer(fileRef, containerName, nodeName)
  591. {
  592. netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
  593. var C                               = Components;
  594. const RDF_SRVC_PROG_ID              = '@mozilla.org/rdf/rdf-service;1';
  595. const RDF_CONTAINER_PROG_ID         = '@mozilla.org/rdf/container;1';
  596. const RDF_DS_PROG_ID                = '@mozilla.org/rdf/datasource;1?name=xml-datasource';
  597. const RDF_CONTAINER_UTILS_PROG_ID     = '@mozilla.org/rdf/container-utils;1';
  598.  
  599.     if (!fileRef.exists()) {
  600.         return;
  601.     }
  602.  
  603.     var myFileUrl=getFileUri( fileRef );
  604.  
  605.  
  606.     try {
  607.       var rdf   = C.classes
  608.                   [RDF_SRVC_PROG_ID].getService(C.interfaces.nsIRDFService);
  609.  
  610.       var ds    = rdf.GetDataSource(myFileUrl);
  611.       var aDS   = ds.QueryInterface(C.interfaces.nsIRDFDataSource);
  612.       var rem   = ds.QueryInterface(C.interfaces.nsIRDFRemoteDataSource);
  613.       if (!rem.loaded) {
  614.         rdf.UnregisterDataSource(ds);
  615.         ds        = C.classes[RDF_DS_PROG_ID].
  616.                     getService(C.interfaces.nsIRDFDataSource);
  617.         rem       = ds.QueryInterface(C.interfaces.nsIRDFRemoteDataSource);
  618.         rem.Init(myFileUrl);
  619.       }
  620.       rem.Refresh(true);
  621.       
  622.       var rs  = rdf.GetResource(containerName);
  623.       var container = C.classes[RDF_CONTAINER_PROG_ID].
  624.                            getService(C.interfaces.nsIRDFContainer);
  625.  
  626.       var contUtils = C.classes[RDF_CONTAINER_UTILS_PROG_ID].
  627.                            getService(C.interfaces.nsIRDFContainerUtils);
  628.  
  629.       container.Init(rem, rs);
  630.       var el = rdf.GetLiteral(nodeName); // remove if it's a literal
  631.  
  632.       if(el.Value){
  633.       dump("Test Empty Literal:" + el.Value + "\n"
  634.           + container.GetCount() +"\n"
  635.           + contUtils.IsEmpty(rem,rs) +"\n");
  636.           container.RemoveElement(el, true);
  637.  
  638.  
  639.       var empt=contUtils.IsEmpty(rem,rs);
  640.       if(empt)
  641.         dump("Empty Container\n" );
  642.       }
  643.       else
  644.       dump("Not an Element" + el.Value + "\n");
  645.  
  646.       el = rdf.GetResource(nodeName); // remove if it's a resource
  647.       if(el.Value){
  648.       dump("Test Empty Resource:" + el.Value +"\n"
  649.           + container.GetCount() +"\n"
  650.           + contUtils.IsEmpty(rem,rs) +"\n");
  651.  
  652.           container.RemoveElement(el, true);
  653.  
  654.  
  655.     }
  656.       else
  657.       dump("Not Resource" + el.Value +"\n");
  658.       
  659.       var empt=contUtils.IsEmpty(rem,rs);
  660.       if(empt)
  661.         dump("Empty Container\n" );
  662.  
  663.  
  664.       rem.Flush();
  665.       rem.Refresh(true);
  666.  
  667.  
  668.     } catch (err) {
  669.         dump("Remove RDF error:" + err);
  670.       return;
  671.     }
  672. // if this overlayinfo file is empty - remove it
  673. isGraphEmpty(fileRef);
  674. if(!itWasntEmpty)
  675. fileRef.remove(true);
  676. }
  677.  
  678.  
  679. // globals
  680. var thisDatasource = null;
  681. var itWasntEmpty = null;
  682.  
  683. function isGraphEmpty(dsURI ) {
  684.  
  685. var C                               = Components;
  686. const RDF_SRVC_PROG_ID              = '@mozilla.org/rdf/rdf-service;1';
  687. const RDF_CONTAINER_PROG_ID         = '@mozilla.org/rdf/container;1';
  688. const RDF_DS_PROG_ID                = '@mozilla.org/rdf/datasource;1?name=xml-datasource';
  689. const RDF_CONTAINER_UTILS_PROG_ID     = '@mozilla.org/rdf/container-utils;1';
  690.  
  691.     if (!dsURI.exists()) {
  692.         return;
  693.     }
  694.  
  695.     var myFileUrl=getFileUri( dsURI );
  696.   
  697.  
  698.     dump("\n\nThis file:\n"+dsURI.path+"\n");
  699.     
  700.       var rdf   = C.classes
  701.                   [RDF_SRVC_PROG_ID].getService(C.interfaces.nsIRDFService);
  702.  
  703.       var ds    = rdf.GetDataSource(myFileUrl);
  704.       var aDS   = ds.QueryInterface(C.interfaces.nsIRDFDataSource);
  705.       thisDatasource  = ds.QueryInterface(C.interfaces.nsIRDFRemoteDataSource);
  706.       if (!thisDatasource.loaded) {
  707.         rdf.UnregisterDataSource(ds);
  708.         ds        = C.classes[RDF_DS_PROG_ID].
  709.                     getService(C.interfaces.nsIRDFDataSource);
  710.         thisDatasource  = ds.QueryInterface(C.interfaces.nsIRDFRemoteDataSource);
  711.         thisDatasource.Init(myFileUrl);
  712.       }
  713.  
  714.  
  715.      if (thisDatasource.loaded) {
  716.        dump("the datasource was already loaded!\n");
  717.            Observer.onEndLoad(thisDatasource);
  718.      } else {
  719.        dump("the datasource wasn't loaded, but it's loading now!\n");
  720.  
  721.           var sink =
  722.                thisDatasource.QueryInterface(
  723.                Components.interfaces.nsIRDFXMLSink);
  724.                sink.addXMLSinkObserver(Observer);
  725.  
  726.      }
  727.  
  728.  
  729. }
  730.  
  731.  
  732.  
  733. var Observer = {
  734.    onBeginLoad: function(aSink)
  735.      {},
  736.    onInterrupt: function(aSink) 
  737.  
  738.      {},
  739.  
  740.    onResume: function(aSink)
  741.      {},
  742.  
  743.    onEndLoad: function(aSink)
  744.      {
  745.  
  746.         var dsResources = thisDatasource.GetAllResources();
  747.         var thisResource = null;
  748.         var arcCursor = null;
  749.         var thisArc = null;
  750.         var arcsCounted = targetsCounted = null;
  751.  
  752.         while(dsResources.hasMoreElements()) {
  753.  
  754.         thisResource = dsResources.getNext().QueryInterface(
  755.                         Components.interfaces.nsIRDFResource);
  756.  
  757.         arcCursor = thisDatasource.ArcLabelsOut(thisResource);
  758.  
  759.         arcsCounted += 1;
  760.         showArcs(thisResource, arcCursor);
  761.     }
  762.  
  763.          itWasntEmpty = targetsCounted;
  764.     },
  765.  
  766.    onError: function(aSink, aStatus, aErrorMsg)
  767.      { dump("error! \n" + aErrorMsg +"\n"); }
  768. };
  769.  
  770.  
  771. function showArcs(thisResource, arcCursor) {
  772.  
  773.      while(arcCursor.hasMoreElements()) {
  774.          arcsCounted += 1;
  775.          thisArc = arcCursor.getNext().QueryInterface(
  776.                    Components.interfaces.nsIRDFResource);
  777.  
  778.          arcTargets = thisDatasource.GetTargets(
  779.                          thisResource,
  780.                          thisArc,
  781.                          true );
  782.  
  783.  
  784.          while(arcTargets.hasMoreElements()) {
  785.  
  786.              targetsCounted += 1 ;             
  787.              thisTarget = arcTargets.getNext();
  788.  
  789.  
  790.              try {
  791.              thisTarget.QueryInterface(
  792.                  Components.interfaces.nsIRDFLiteral);
  793.             
  794.              } catch(e) {
  795.                 newArcCursor = thisDatasource.ArcLabelsOut(
  796.                                thisTarget);
  797.                 targetsCounted -= 1 ;
  798.                 showArcs(thisTarget, newArcCursor);
  799.              }
  800.  
  801.     }
  802.  
  803.   }
  804.  
  805. }
  806.  
  807.